package com.sky.controller.admin;

import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {

    // 本地存储路径
    private static final String UPLOAD_PATH = "D:\\hmail\\nginx-1.20.2\\html\\sky\\img\\";

    // 访问路径前缀（根据你的nginx配置调整）
    private static final String ACCESS_URL_PREFIX = "/static/img/";

    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public Result<String> upload(@RequestParam("file") MultipartFile file) {
        log.info("文件上传开始");

        try {
            // 检查文件是否为空
            if (file.isEmpty()) {
                log.error("上传文件为空");
                return Result.error("上传文件不能为空");
            }

            // 原始文件名
            String originalFilename = file.getOriginalFilename();
            log.info("原始文件名: {}", originalFilename);

            // 检查文件名是否为空
            if (originalFilename == null || originalFilename.trim().isEmpty()) {
                log.error("文件名为空");
                return Result.error("文件名不能为空");
            }

            // 截取原始文件名的后缀
            String suffix = "";
            int lastDotIndex = originalFilename.lastIndexOf(".");
            if (lastDotIndex != -1) {
                suffix = originalFilename.substring(lastDotIndex);
            }
            log.info("文件后缀: {}", suffix);

            // 验证文件类型（只允许图片格式）
            if (!isImageFile(suffix)) {
                log.error("不支持的文件类型: {}", suffix);
                return Result.error("只支持图片格式文件 (jpg, jpeg, png, gif, bmp)");
            }

            // 构造新文件名称 (使用UUID避免重名)
            String newFileName = UUID.randomUUID().toString() + suffix;
            log.info("新文件名: {}", newFileName);

            // 确保上传目录存在
            File uploadDir = new File(UPLOAD_PATH);
            if (!uploadDir.exists()) {
                boolean created = uploadDir.mkdirs();
                if (!created) {
                    log.error("创建上传目录失败: {}", UPLOAD_PATH);
                    return Result.error("创建上传目录失败");
                }
            }

            // 完整的文件路径
            String fullPath = UPLOAD_PATH + newFileName;
            File destFile = new File(fullPath);

            // 保存文件到本地
            file.transferTo(destFile);

            // 文件的请求路径 (用于前端访问)
            String accessUrl = ACCESS_URL_PREFIX + newFileName;
            log.info("文件上传成功，访问路径: {}", accessUrl);

            return Result.success(accessUrl);

        } catch (IOException e) {
            log.error("文件上传失败", e);
            return Result.error("文件上传失败: " + e.getMessage());
        } catch (Exception e) {
            log.error("文件上传异常", e);
            return Result.error("文件上传异常: " + e.getMessage());
        }
    }

    /**
     * 验证是否为图片文件
     * @param suffix 文件后缀
     * @return 是否为图片文件
     */
    private boolean isImageFile(String suffix) {
        if (suffix == null || suffix.isEmpty()) {
            return false;
        }

        String lowerSuffix = suffix.toLowerCase();
        return lowerSuffix.equals(".jpg") ||
                lowerSuffix.equals(".jpeg") ||
                lowerSuffix.equals(".png") ||
                lowerSuffix.equals(".gif") ||
                lowerSuffix.equals(".bmp");
    }
}